home *** CD-ROM | disk | FTP | other *** search
/ Komputer for Alle 2004 #2 / K-CD-2-2004.ISO / OpenOffice Sv / f_0397 / python-core-2.2.2 / lib / netrc.py < prev    next >
Encoding:
Python Source  |  2003-07-18  |  3.9 KB  |  109 lines

  1. """An object-oriented interface to .netrc files."""
  2.  
  3. # Module and documentation by Eric S. Raymond, 21 Dec 1998
  4.  
  5. import os, shlex
  6.  
  7. __all__ = ["netrc", "NetrcParseError"]
  8.  
  9.  
  10. class NetrcParseError(Exception):
  11.     """Exception raised on syntax errors in the .netrc file."""
  12.     def __init__(self, msg, filename=None, lineno=None):
  13.         self.filename = filename
  14.         self.lineno = lineno
  15.         self.msg = msg
  16.         Exception.__init__(self, msg)
  17.  
  18.     def __str__(self):
  19.         return "%s (%s, line %s)" % (self.msg, self.filename, self.lineno)
  20.  
  21.  
  22. class netrc:
  23.     def __init__(self, file=None):
  24.         if not file:
  25.             file = os.path.join(os.environ['HOME'], ".netrc")
  26.         fp = open(file)
  27.         self.hosts = {}
  28.         self.macros = {}
  29.         lexer = shlex.shlex(fp)
  30.         # Allows @ in hostnames.  Not a big deal...
  31.         lexer.wordchars = lexer.wordchars + '.-@'
  32.         while 1:
  33.             # Look for a machine, default, or macdef top-level keyword
  34.             toplevel = tt = lexer.get_token()
  35.             if not tt:
  36.                 break
  37.             elif tt == 'machine':
  38.                 entryname = lexer.get_token()
  39.             elif tt == 'default':
  40.                 entryname = 'default'
  41.             elif tt == 'macdef':                # Just skip to end of macdefs
  42.                 entryname = lexer.get_token()
  43.                 self.macros[entryname] = []
  44.                 lexer.whitespace = ' \t'
  45.                 while 1:
  46.                     line = lexer.instream.readline()
  47.                     if not line or line == '\012':
  48.                         lexer.whitespace = ' \t\r\n'
  49.                         break
  50.                     self.macros[entryname].append(line)
  51.                 continue
  52.             else:
  53.                 raise NetrcParseError(
  54.                     "bad toplevel token %r" % tt, file, lexer.lineno)
  55.  
  56.             # We're looking at start of an entry for a named machine or default.
  57.             login = account = password = None
  58.             self.hosts[entryname] = {}
  59.             while 1:
  60.                 tt = lexer.get_token()
  61.                 if (tt=='' or tt == 'machine' or
  62.                     tt == 'default' or tt =='macdef'):
  63.                     if login and password:
  64.                         self.hosts[entryname] = (login, account, password)
  65.                         lexer.push_token(tt)
  66.                         break
  67.                     else:
  68.                         raise NetrcParseError(
  69.                             "malformed %s entry %s terminated by %s"
  70.                             % (toplevel, entryname, repr(tt)),
  71.                             file, lexer.lineno)
  72.                 elif tt == 'login' or tt == 'user':
  73.                     login = lexer.get_token()
  74.                 elif tt == 'account':
  75.                     account = lexer.get_token()
  76.                 elif tt == 'password':
  77.                     password = lexer.get_token()
  78.                 else:
  79.                     raise NetrcParseError("bad follower token %r" % tt,
  80.                                           file, lexer.lineno)
  81.  
  82.     def authenticators(self, host):
  83.         """Return a (user, account, password) tuple for given host."""
  84.         if self.hosts.has_key(host):
  85.             return self.hosts[host]
  86.         elif self.hosts.has_key('default'):
  87.             return self.hosts['default']
  88.         else:
  89.             return None
  90.  
  91.     def __repr__(self):
  92.         """Dump the class data in the format of a .netrc file."""
  93.         rep = ""
  94.         for host in self.hosts.keys():
  95.             attrs = self.hosts[host]
  96.             rep = rep + "machine "+ host + "\n\tlogin " + repr(attrs[0]) + "\n"
  97.             if attrs[1]:
  98.                 rep = rep + "account " + repr(attrs[1])
  99.             rep = rep + "\tpassword " + repr(attrs[2]) + "\n"
  100.         for macro in self.macros.keys():
  101.             rep = rep + "macdef " + macro + "\n"
  102.             for line in self.macros[macro]:
  103.                 rep = rep + line
  104.             rep = rep + "\n"
  105.         return rep
  106.  
  107. if __name__ == '__main__':
  108.     print netrc()
  109.